Módulo:ComicsInfobox
Começo Módulo esqueleto. Tudo constrói fora disto. local Infobox = {} ---------------------------- -- Bibliotecas de funções -- ---------------------------- -- significa High Frequency local HF = require("Module:ComicsHF") --Parâmetros de invocação de Parses, abrange espaços em branco e remove espaços em branco local getArgs = require('Dev:Arguments').getArgs -- Funções para criar listas do Wikitext local L = require("Dev:List") -- Uma vez que isso só deve ser avaliado uma vez por visualização de página, agora é global _G.vars = { Pagename = mw.title.getCurrentTitle().text } --------------------- -- Funções locais -- --------------------- local function invokeInt(funcName) -- Este invólucro permite a invocação de artigos e modelos -- das funções internas do Lua. return function (frame) local args = getArgs(frame, { trim = true, removeBlanks = true }) return InfoboxfuncName(args, vars) end end ---------------------- -- Funções públicas -- ---------------------- function Infobox.CategoriesFromKeywords( fieldValue, valid, exceptions, vars ) local output = "" -- O campo não está em branco if fieldValue ~= nil then --Pegue um par válido e use-o for validKey, validValue in pairs(valid) do -- Se você encontrar o validKey no campo, olhar mais de perto if string.find( string.lower(fieldValue), validKey ) ~= nil then --Verifique se existem exceções para o validKey if type(exceptionsvalidKey) ~= "table" then -- Não há exceções -- Apenas categorizar usando este validKey -- e passar para a próxima validKey for valueKey, valueCategoryName in ipairs( validValue ) do output = output .. HF.CategoryLink( valueCategoryName, vars.Pagename, "" ) end end end end end return output end -- Chamadas _sanitizeInput de um modelo function Infobox.sanitize(frame) local args = getArgs(frame, { trim = true, removeBlanks = true }) return Infobox._sanitizeInput(args1) end -- Limpa as entradas desleixadas em algo mais útil -- Isso reduz a necessidade de executar um bot e fazer com que os usuários mudem os hábitos function Infobox._sanitizeInput( input ) --definir "saída" de "entrada" e manipular "saída" local output = input -- Não há mais quebras de linha output = string.gsub( output, '(,;) %s*.', '%1 ' ) -- Onde há apenas uma quebra de linha e sem delimitador, deve haver um delimitador. output = string.gsub( output, ' %s*.', '; ' ) -- Coloque referências em que pertençam (antes de um delimitador) output = string.gsub( output, '(,;)("?) ', '%2 %1 ' ) return output end function Infobox._cloakCommas( input ) local output = input --troque temporariamente essas vírgulas interiores para obscurecer o símbolo "§" output = string.gsub( output, '%((^,)*),(^,)*)%)', '(%1§%2)' ) -- Faça o mesmo para modelos output = string.gsub( output, ' ', ' ' ) -- Faça o mesmo para Links e Categorias -- itemstring = string.gsub( itemstring, -- '%[%[(^,)*),(^,)*)|[(^,)*),(^,)*)%]%]', -- '%3§%4' -- ) return output end -- Chama _hlist de um modelo Infobox.hlist = invokeInt('_hlist') -- Função interna para criar listas horizontais function Infobox._hlist( args ) -- ** Determine valores para a função ** -- -- Delimitador é o separador entre itens. Padrão para } local delimiter = args'delimiter' or args1 or ';' -- A seqüência de texto simples a ser alterada para uma lista. -- Se não houver }, então é o único argumento sem nome. local itemstring = args'value' or args2 or args1 or nil if not args2 then delimiter = args'delimiter' or args1 or ';' end itemstring = Infobox._sanitizeInput( itemstring ) -- Recorte baseado em comprimento opcional. local trim = args'trim' or args3 or false if delimiter ',' and ( string.match( itemstring, '%((^,)*),(^,)*)%)') or string.match( itemstring, ' ') ) -- Se os itens estiverem separados por vírgulas e -- há vírgulas entre parênteses -- Como "Mansão Wayne (Gotham City, Gotham City)", then itemstring = Infobox._cloakCommas( itemstring ) end if mw.ustring.match(itemstring, ';' ) and not mw.ustring.match(itemstring, '(.*);(.*);' ) and delimiter ',' -- se há apenas um ponto e vírgula e o delimitador é ',' -- então, não importa o que seja, o que quer que seja antes do ponto-e-vírgula está na "frente" then local primary = mw.ustring.match(itemstring, '(.*);' ) local secondary = mw.ustring.match(itemstring, ';(.*)' ) --Separar os itens individuais por delimitador -- e colocá-los em uma tabela (ou array) local items1 = HF.explode( delimiter, primary ) local items2 = HF.explode( delimiter, secondary ) -- Pegue os itens nas tabelas de volta -- e reproduzi-los como listas horizontais e com marcadores local list1 = L.makeList( 'horizontal', items1 ) local list2 = L.makeList( 'horizontal', items2 ) -- Crie o wrapper de conteúdo para trás local morebox = mw.html.create('div') :addClass('expansion-tag') :addClass('mw-collapsible') :addClass('mw-collapsed') :attr('data-expandtext', morelabel) :attr('data-collapsetext', lesslabel) :wikitext(list2):allDone() -- Saída de tudo -- Se mudarmos os símbolos antes, os mudaremos agora return mw.ustring.gsub( list1 .. tostring(morebox), '§', ',' ) elseif type(trim) 'number' and mw.ustring.len( itemstring ) > trim -- Se houver um valor para aparar -- e a entrada é maior do que o limite dado then -- quebre a corda inicial no pré-limite (frente) -- e cadeias pós-limite (de volta) strings local primary = string.sub( input, 1, trim ) local secondary = string.sub( input, trim ) local shiftatbreak = '' -- Faça uma pausa natural no delimitador antes do limiar -- e mova o restante para a volta da string primary, shiftatbreak = mw.ustring.match( primary, '(.*)'..delimiter..'(.*)$' ) secondary = shiftatbreak .. secondary --Separar os itens individuais por delimitador -- e colocá-los em uma tabela (ou array) local items1 = HF.explode( delimiter, primary ) local items2 = HF.explode( delimiter, secondary ) -- Se mudarmos os símbolos antes, os mudaremos agora for i, v in ipairs( items1 ) do v = mw.ustring.gsub( v, '§', ',' ) end for i, v in ipairs( items2 ) do v = mw.string.gsub( v, '§', ',' ) end --Pegue os itens nas mesas frontal e tabelas -- e reproduzi-los como listas horizontais e com marcadores local list1 = L.makeList( 'horizontal', items1 ) local list2 = L.makeList( 'horizontal', items2 ) -- Crie o wrapper de conteúdo HTML para trás local morebox = mw.html.create('div') :addClass('expansion-tag') :addClass('mw-collapsible') :addClass('mw-collapsed') :attr('data-expandtext', morelabel) :attr('data-collapsetext', lesslabel) :wikitext(list2):allDone() -- Saída de tudo -- Se mudarmos os símbolos antes, os mudaremos agora return string.gsub( list1 .. tostring(morebox), '§', ',' ) else --Se não há trim, ou está tudo abaixo do limiar -- Separar os itens individuais por delimitador -- e colocá-los em uma tabela (ou array) local items = HF.explode( delimiter, itemstring ) -- Pegue os itens na tabela -- e reproduzi-los como uma lista horizontal com marcadores local list = L.makeList( 'horizontal', items ) -- Saída da lista -- Se mudarmos os símbolos antes, os mudaremos agora return string.gsub( list, '§', ',' ) end end -- Retorne o esqueleto do Módulo. return Infobox